#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
异步任务装饰器
提供方便的装饰器，用于将普通函数转换为异步任务
"""

import functools
import inspect
from typing import Callable, Dict, Any, Optional

from .task_manager import default_task_manager
from settings.config import logger


def async_task(task_type: Optional[str] = None):
    """
    异步任务装饰器
    将普通函数转换为异步任务
    
    Args:
        task_type: 任务类型，默认为函数名
        
    Returns:
        装饰后的函数
    """
    def decorator(func: Callable):
        # 获取函数签名
        sig = inspect.signature(func)
        
        # 确定任务类型
        _task_type = task_type or func.__name__
        
        # 注册任务处理器
        default_task_manager.register_task_handler(_task_type, func)
        
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            # 提取account_id参数（如果存在）
            account_id = kwargs.get('account_id')
            
            # 构建任务参数
            params = {}
            
            # 将位置参数转换为命名参数
            bound_args = sig.bind_partial(*args, **kwargs)
            bound_args.apply_defaults()
            
            # 将所有参数添加到params中
            for param_name, param_value in bound_args.arguments.items():
                # 跳过self参数
                if param_name == 'self':
                    continue
                    
                # 跳过task_id参数（由TaskManager生成）
                if param_name == 'task_id':
                    continue
                    
                # 尝试将参数值转换为可JSON序列化的类型
                try:
                    # 简单检查是否可序列化
                    if hasattr(param_value, '__dict__'):
                        # 对象转为字典
                        params[param_name] = {'__object__': str(param_value)}
                    else:
                        params[param_name] = param_value
                except:
                    # 如果无法序列化，则存储字符串表示
                    params[param_name] = str(param_value)
            
            # 提交异步任务
            result = default_task_manager.submit_task(
                task_type=_task_type,
                params=params,
                account_id=account_id
            )
            
            logger.info(f"异步任务已提交: {_task_type}, task_id: {result.get('task_id')}")
            return result
            
        return wrapper
    
    return decorator


def get_task_status(task_id: str) -> Dict[str, Any]:
    """
    获取任务状态
    
    Args:
        task_id: 任务ID
        
    Returns:
        dict: 任务状态信息
    """
    return default_task_manager.get_task_status(task_id)